package com.woshua.fileprovidermodel;

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

import com.tbruyelle.rxpermissions2.RxPermissions;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import io.reactivex.functions.Consumer;

/**
 * 拍照:android 7.0以后问题:
 * 1、android.os.FileUriExposedException
 * 官方网站的解释:
 * 对于面向 Android 7.0 的应用，Android 框架执行的 StrictMode API
 * 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用，
 * 则应用出现故障，并出现 FileUriExposedException 异常。
 *解决方案:
 * 要在应用间共享文件，您应发送一项 content:// URI，并授予 URI 临时访问权限。
 * 进行此授权的最简单方式是使用 FileProvider 类。
 * 如需了解有关权限和共享文件的详细信息，请参阅共享文件。
 *
 * FileProvider实际上是ContentProvider的一个子类，
 * 它的作用也比较明显了，file:///Uri不给用，那么换个Uri为content://来替代。
 *
 * android 4.4
 * Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord
 * 因为低版本的系统，仅仅是把这个当成一个普通的Provider在使用，而我们没有授权，
 * contentprovider的export设置的也是false；导致Permission Denial
 *
 * context提供了两个方法：
 *
 * grantUriPermission(String toPackage, Uri uri,
 * int modeFlags)
 * revokeUriPermission(Uri uri, int modeFlags);
 * */
public class MainActivity extends AppCompatActivity {

    private ImageView ivTakePhoto;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ivTakePhoto=findViewById(R.id.take_photo_image);
    }

    private String mCurrentPhotoPath;

    private static final int REQUEST_CODE_TAKE_PHOTO=0x110;

    /**
     * 拍照
     * */
    @SuppressLint("CheckResult")
    public void onTakePhotoClick(View view) {
        RxPermissions rxPermissions = new RxPermissions(this);
        rxPermissions.request(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                .subscribe(new Consumer<Boolean>() {
            @Override
            public void accept(Boolean aBoolean) throws Exception {
                if(aBoolean)
                {
                    // 打开相机
                    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    //判断Activity是否存在
                    if(takePictureIntent.resolveActivity(getPackageManager())!=null)
                    {
                        String filename = new SimpleDateFormat("yyyyMMdd-HHmmss", Locale.CHINA)
                                .format(new Date()) + ".png";
                        String rootPath = Environment.getExternalStorageDirectory().getAbsoluteFile() + File.separator + "pics";
                        File file = new File(rootPath);
                        if(!file.exists())
                        {
                            file.mkdirs();
                        }
                        file=new File(rootPath,filename);
                        mCurrentPhotoPath=file.getAbsolutePath();
//                        Uri fileUri = FileProvider.getUriForFile(MainActivity.this, "com.woshua.fileprovidermodel.fileprovider", file);

                        //第一种方法 根据Intent查询出的所以符合的应用，都给他们授权~~
//                        List<ResolveInfo> resInfoList = getPackageManager()
//                                .queryIntentActivities(takePictureIntent, PackageManager.MATCH_DEFAULT_ONLY);
//                        for (ResolveInfo resolveInfo : resInfoList) {
//                            String packageName = resolveInfo.activityInfo.packageName;
//                            grantUriPermission(packageName, fileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION
//                                    | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
//                        }

//                        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
//                        第二种方法
                        Uri fileUri = null;
                        if (Build.VERSION.SDK_INT >= 24) {
                            fileUri = FileProvider.getUriForFile(MainActivity.this, "com.woshua.fileprovidermodel.fileprovider", file);
                        } else {
                            fileUri = Uri.fromFile(file);
                        }
                        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

                        startActivityForResult(takePictureIntent, REQUEST_CODE_TAKE_PHOTO);
                    }
                }
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK && requestCode == REQUEST_CODE_TAKE_PHOTO)
        {
            ivTakePhoto.setImageBitmap(BitmapFactory.decodeFile(mCurrentPhotoPath));
        }
    }
}
